home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-04-03 | 16.4 KB | 622 lines | [TEXT/MPS ] |
- //----------------------------------------------------------------------------------------
- // UViewServer.cp
- // Copyright © 1987-96 by Apple Computer, Inc. All rights reserved.
- //----------------------------------------------------------------------------------------
-
- #ifndef __UVIEWSERVER__
- #include "UViewServer.h"
- #endif
-
- // MacApp
-
- #ifndef __UADORNERS__
- #include "UAdorners.h"
- #endif
-
- // #ifndef __UAPPLICATION__
- // #include "UApplication.h"
- // #endif
-
- #ifndef __UCOREGLOBALS__
- #include "UCoreGlobals.h"
- #endif
-
- #ifndef __UCOREUTILITIES__
- #include "UCoreUtilities.h"
- #endif
-
- #ifndef __UDEBUG__
- #include "UDebug.h"
- #endif
-
- #ifndef __UDISPATCHER__
- #include "UDispatcher.h"
- #endif
-
- // #ifndef __UERRORMGR__
- // #include "UErrorMgr.h"
- // #endif
-
- #ifndef __UGEOMETRY__
- #include "UGeometry.h"
- #endif
-
- #ifndef __UMACAPPGLOBALS__
- #include "UMacAppGlobals.h"
- #endif
-
- #ifndef __UMACAPPUTILITIES__
- #include "UMacAppUtilities.h"
- #endif
-
- #ifndef __UMEMORY__
- #include "UMemory.h"
- #endif
-
- #ifndef __USCROLLER__
- #include "UScroller.h"
- #endif
-
- #ifndef __USTREAM__
- #include "UStream.h"
- #endif
-
- #ifndef __UWINDOW__
- #include "UWindow.h"
- #endif
-
- // Toolbox
-
- #ifndef __RESOURCES__
- #include <Resources.h>
- #endif
-
- // ANSI
-
- #ifndef __STDIO__
- #include <stdio.h>
- #endif
-
-
- //----------------------------------------------------------------------------------------
- // global declarations for globals defined in interface
- TViewServer* gViewServer;
-
-
- //========================================================================================
- // CLASS TViewServer
- //========================================================================================
- #undef Inherited
- #define Inherited TObject
-
- #pragma segment MAInit
- MA_DEFINE_CLASS_M1(TViewServer, Inherited);
-
- //----------------------------------------------------------------------------------------
- // TViewServer::TViewServer: Empty constructor to satisfy the compiler.
- //----------------------------------------------------------------------------------------
- #pragma segment ConstructorRes
-
- TViewServer::TViewServer()
- {
- } // TViewServer::TViewServer
-
- //----------------------------------------------------------------------------------------
- // TViewServer::IViewServer:
- //----------------------------------------------------------------------------------------
- #pragma segment MAInit
-
- void TViewServer::IViewServer()
- {
- this->IObject();
-
- gViewServer = this; // set the global reference.
- } // TViewServer::IViewServer
-
- //----------------------------------------------------------------------------------------
- // TViewServer::Free:
- //----------------------------------------------------------------------------------------
- #pragma segment MAClose
-
- TViewServer::~TViewServer()
- {
- gViewServer = NULL; // NULL out the global reference.
- } // TViewServer::Free
-
- //----------------------------------------------------------------------------------------
- // TViewServer::NewPaletteWindow:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- TWindow* TViewServer::NewPaletteWindow(ResNumber itsRsrcID,
- Boolean wantHScrollBar,
- Boolean wantVScrollBar,
- TDocument* itsDocument,
- TView* itsMainView,
- TView* itsPaletteView,
- short sizePalette,
- VHSelect whichWay)
-
- {
- // create the window, adjust its resize limits, and add the palette view
- MAVolatileInit(TWindow*, aWindow, NewTWindow(itsRsrcID, itsDocument));
- (aWindow->fResizeLimits[topLeft])[whichWay] += sizePalette;
- aWindow->AddSubView(itsPaletteView);
-
- // calculate location of itsMainView
- VPoint itsLocation = gZeroVPt;
- itsLocation[whichWay] = sizePalette;
-
- // add itsMainView to the window with optional scroller
- FailInfo fi;
- Try(fi)
- {
- this->AddSubViewWithScroller(aWindow, itsMainView, wantHScrollBar, wantVScrollBar, itsLocation);
-
- fi.Success();
- }
- else // Recover
- {
- aWindow = (TWindow *)FreeIfObject(aWindow);
-
- fi.ReSignal(); // Optional. Omit to continue.
- }
-
- return aWindow;
- } // TViewServer::NewPaletteWindow
-
- //----------------------------------------------------------------------------------------
- // TViewServer::NewSimpleWindow:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- TWindow* TViewServer::NewSimpleWindow(ResNumber itsRsrcID,
- Boolean wantHScrollBar,
- Boolean wantVScrollBar,
- TDocument* itsDocument,
- TView* itsView)
-
- {
- // create the window
- MAVolatileInit(TWindow*, aWindow, NewTWindow(itsRsrcID, itsDocument));
-
- // add itsView to the window with optional scroller
- FailInfo fi;
- Try(fi)
- {
- this->AddSubViewWithScroller(aWindow, itsView, wantHScrollBar, wantVScrollBar, gZeroVPt);
-
- fi.Success();
- }
- else // Recover
- {
- aWindow = (TWindow *)FreeIfObject(aWindow);
-
- fi.ReSignal(); // Optional. Omit to continue.
- }
-
- return aWindow;
- } // TViewServer::NewSimpleWindow
-
- //----------------------------------------------------------------------------------------
- // TViewServer::AddSubViewWithScroller:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- void TViewServer::AddSubViewWithScroller(TWindow* aWindow,
- TView* itsView,
- Boolean wantHScrollBar,
- Boolean wantVScrollBar,
- const VPoint& itsLocation)
- {
- TScroller * aScroller = NULL;
-
- if (wantHScrollBar || wantVScrollBar)
- {
- // calculate scroller's dimensions
- VRect sBarOffsets = gZeroVRect;
- VPoint itsSize = aWindow->fSize;
-
- // Account for scroller _not_ being located at VPoint (0,0)
- // as when a palette is sharing the window.
- itsSize -= itsLocation;
-
- if (wantHScrollBar)
- {
- itsSize.v -= kSBarSizeMinus1;
- if (!wantVScrollBar)
- sBarOffsets.right = -kSBarSizeMinus1;
- }
- if (wantVScrollBar)
- {
- itsSize.h -= kSBarSizeMinus1;
- if (!wantHScrollBar)
- sBarOffsets.bottom = -kSBarSizeMinus1;
- }
-
- // create the scroller
- aScroller = new TScroller;
- aScroller->IScroller(aWindow, itsLocation, itsSize, sizeRelSuperView, sizeRelSuperView, gZeroVPt, wantHScrollBar, wantVScrollBar);
- aScroller->fSBarOffsets = sBarOffsets;
- }
-
- // add the subview
- if (aScroller)
- aScroller->AddSubView(itsView);
- else
- aWindow->AddSubView(itsView);
-
- aWindow->SetWindowTarget(itsView);
-
- // make sure window and subviews are the right size
- aWindow->Resize(((CRect &) GetWindowPort(aWindow->fWMgrWindow)->portRect).GetSize(), kDontInvalidate);
- } // TViewServer::AddSubViewWithScroller
-
- //----------------------------------------------------------------------------------------
- // TViewServer::NewTWindow:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- TWindow* TViewServer::NewTWindow(ResNumber itsRsrcID,
- TDocument* itsDocument)
-
- {
- TWindow * aWindow = NULL;
- Boolean canResize;
- Boolean canClose;
-
- WindowRef storage = NULL;
- #if !STRICT_WINDOWS
- storage = (WindowRef)new CWindowRecord;
- #endif
-
- MAVolatileInit(WindowRef, aWMgrWindow, gDispatcher->NewToolboxWindow((Ptr)storage, itsRsrcID, canResize, canClose));
- // NewToolboxWindow signals Failure
-
- FailInfo fi;
- Try(fi)
- {
- aWindow = new TWindow;
- fi.Success();
- }
- else // Recover
- {
- aWMgrWindow = TWindow::FreeIfWMgrWindow(aWMgrWindow, storage == NULL);
- fi.ReSignal();
- }
-
- // !STRICT_WINDOWS (FALSE) means TWindow can't dispose wmgr window when freed, just CloseWindow.
- aWindow->IWindow(itsDocument, aWMgrWindow, canResize, canClose, !STRICT_WINDOWS);
-
- return aWindow;
- } // TViewServer::NewTWindow
-
- //----------------------------------------------------------------------------------------
- // TViewServer::NewTemplateWindow:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- TWindow* TViewServer::NewTemplateWindow(ResNumber viewRsrcID,
- TDocument* itsDocument)
-
- {
- TWindow *theWindow = NULL;
- TView *aView = NULL;
-
- MAVolatileInit(TView*,theTarget,NULL);
-
- FailInfo fi;
- Try(fi)
- {
- aView = this->DoCreateViews(itsDocument, NULL, viewRsrcID, gZeroVPt);
- if (aView)
- {
- #if qDebug
- if (!(aView->DescendsFrom(TWindow::GetClassDescStatic())))
- ProgramBreak("In NewTemplateWindow: Root view is not a window");
- #endif
- theWindow = (TWindow *)aView;
-
- if (theWindow->fTargetID != kNoIdentifier)
- {
- theTarget = theWindow->FindSubView(theWindow->fTargetID);
- if (theTarget)
- {
- theWindow->SetWindowTarget(theTarget);
- }
- #if qDebug
- else
- {
- CStr255 errString("TViewServer::NewTemplateWindow:\n The window's indicated target view cannot be found.\n");
- errString += " Unable to find view with fTargetID: '" + CStr255(theWindow->fTargetID) + "'.";
- ProgramBreak(errString);
- }
- #endif
- }
- fi.Success();
- }
- }
- else // recover
- {
- aView = (TView*)FreeIfObject(aView);
- fi.ReSignal();
- }
- return theWindow;
- } // TViewServer::NewTemplateWindow
-
- //----------------------------------------------------------------------------------------
- // TViewServer::ReadViewsFromResource:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- TView* TViewServer::ReadViewsFromResource(TDocument* /* itsDocument */,
- TView* parentView,
- ResNumber itsRsrcID,
- const VPoint& subviewOffset)
-
- {
- MAVolatileInit(TView*, firstView, NULL); // Assume the worst.
- MAVolatileInit(TStream*, itsViewStream, NULL);
-
- FailInfo fi;
- Try(fi)
- {
- itsViewStream = this->DoMakeViewStream(itsRsrcID, NULL);
-
- short numViews = itsViewStream->ReadInteger();
-
- if (numViews == kMAThreeOhTemplateVersion)// actually, the view template version
- {
- firstView = this->ReadViewsFrom(itsViewStream, parentView, subviewOffset);// the new protocol
- }
- else
- {
- ProgramBreak("Incompatible version of 'View' resources");
- }
- fi.Success();
- }
- else // Recover
- {
- // set position so that when the view stream frees itself,
- // it won't truncate the handle (see THandleStream::Free)
- // If it did truncate the handle, we'd have no hope of ever
- // re-reading this 'View'
- if (itsViewStream != NULL)
- {
- itsViewStream->SetPosition(itsViewStream->GetSize());
- }
- itsViewStream = (TStream *)FreeIfObject(itsViewStream);
- firstView = (TView *)FreeIfObject(firstView);
- fi.ReSignal();
- }
-
- itsViewStream = (TStream *)FreeIfObject(itsViewStream);
-
- return firstView;
- } // TViewServer::ReadViewsFromResource
-
- //----------------------------------------------------------------------------------------
- // TViewServer::ReadViewsFrom:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- TView* TViewServer::ReadViewsFrom(TStream* itsStream,
- TView* parentView,
- const VPoint& subviewOffset)
- {
- //MAVolatileInit(TView*, aView, NULL);
- TView* aView = NULL; // can't be volatile because it is passed by reference
-
- FailInfo fi;
- Try(fi)
- {
- itsStream->ReadStreamObject((TObject * &)aView);
- if (aView)
- {
- if (parentView)
- {
- parentView->AddSubView(aView);
- }
-
- if (subviewOffset != gZeroVPt)
- {
- aView->Locate(aView->fLocation + subviewOffset, kDontInvalidate);
- }
- }
- #if qDebugMsg
- else
- ProgramBreak("###Unknown TView in TViewServer::ReadViewsFrom.");
- #endif
-
- fi.Success();
- }
- else // Recover
- {
- aView = (TView *)FreeIfObject(aView);
- fi.ReSignal();
- }
-
- return aView;
- } // TViewServer::ReadViewsFrom
-
- //----------------------------------------------------------------------------------------
- // TViewServer::DoCreateViews:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- TView* TViewServer::DoCreateViews(TDocument* itsDocument,
- TView* parentView,
- ResNumber itsRsrcID,
- const VPoint& subviewOffset)
- {
- TView * rootView = this->ReadViewsFromResource(itsDocument, parentView, itsRsrcID, subviewOffset);
- if (rootView)
- {
- FailInfo fi;
- Try(fi)
- {
- rootView->HandlePostCreate(itsDocument);
- fi.Success();
- }
- else // Recover
- {
- rootView->Free();
- fi.ReSignal();
- }
- rootView->AdjustFrame(); // Make sure size gets adjusted by the size determiners
- }
- return rootView;
- } // TViewServer::DoCreateViews
-
- //----------------------------------------------------------------------------------------
- // TViewServer::DoMakeViewStream:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- TStream* TViewServer::DoMakeViewStream(ResNumber itsRsrcID,
- Handle itsHandle)
- {
- Handle viewStreamHandle;
- MAVolatileInit(THandleStream*, itsViewStream, NULL);
- MAVolatileInit(TContext*, itsContext, NULL);
-
- if (itsHandle)
- viewStreamHandle = itsHandle;
- else
- {
- // Try to get a new 'View' resource first. If not found, then get a 'view' resource.
- viewStreamHandle = GetResource('View', itsRsrcID);
- #if qDebug
- if (!viewStreamHandle)
- {
- viewStreamHandle = GetResource('view', itsRsrcID);
- if (viewStreamHandle)
- {
- ProgramBreak("Use ViewPromoter. Program contains 2.0 'view' resources");
- ReleaseResource(viewStreamHandle);
- viewStreamHandle = NULL;
- }
- }
- #endif
-
- FailNILResource(viewStreamHandle);
- }
-
- itsViewStream = new THandleStream;
- itsViewStream->IHandleStream(viewStreamHandle, sizeof(long));
-
- FailInfo fi;
- Try(fi)
- {
- Boolean newEntry;
-
- itsContext = new TContext;
- itsContext->IContext();
- itsContext->Add(gDimAdorner, kDontForceReplacement, newEntry);
- itsContext->Add(gDrawAdorner, kDontForceReplacement, newEntry);
- itsContext->Add(gEraseAdorner, kDontForceReplacement, newEntry);
- itsContext->Add(gHiliteAdorner, kDontForceReplacement, newEntry);
- itsContext->Add(gPrintAdorner, kDontForceReplacement, newEntry);
- itsContext->Add(gResizeIconAdorner, kDontForceReplacement, newEntry);
- itsContext->Add(gSelectionAdorner, kDontForceReplacement, newEntry);
-
- fi.Success();
- }
- else // Recover
- {
- itsViewStream = (THandleStream *)FreeIfObject(itsViewStream);
- fi.ReSignal();
- }
-
- if (itsContext)
- itsViewStream->SetContext(itsContext);
-
- return itsViewStream;
- } // TViewServer::DoMakeViewStream
-
- //----------------------------------------------------------------------------------------
- // TViewServer::WriteViewsToResource:
- //----------------------------------------------------------------------------------------
- #pragma segment MAWriteResource
-
- void TViewServer::WriteViewsToResource(TView* view,
- ResNumber itsRsrcID,
- const CStr255& name,
- short resourceAttributes)
- {
- MAVolatileInit(Handle, viewHandle, NULL);
-
- #if qDebugMsg
- if ((viewHandle = Get1Resource('View', itsRsrcID)) != NULL)
- fprintf(stderr, "###TViewServer::WriteViewsToResource warning: About to over-write 'View' resource id %d.\n", itsRsrcID);
- #endif
-
- viewHandle = this->WriteViewsToHandle(view);// write the views to the handle
- FailNIL(viewHandle);
-
- FailInfo fi;
- Try(fi)
- {
- AddResource(viewHandle, 'View', itsRsrcID, name);// add the handle as a resource
- FailResError();
- fi.Success();
- }
- else // Recover
- {
- viewHandle = DisposeIfHandle(viewHandle);
- fi.ReSignal();
- }
-
- SetResAttrs(viewHandle, resourceAttributes);// set the resource attributes
- FailResError();
-
- // Need the following ChangedResource call because the SetResAttrs call on the previous
- // line cleared the "resChanged" attribute of the resource.
- ChangedResource(viewHandle);
- FailResError();
-
- } // TViewServer::WriteViewsToResource
-
- //----------------------------------------------------------------------------------------
- // TViewServer::WriteViewsToHandle:
- //----------------------------------------------------------------------------------------
- #pragma segment MAWriteResource
-
- Handle TViewServer::WriteViewsToHandle(TView* view)
- {
- MAVolatileInit(Handle, aHandle, NULL);
- MAVolatileInit(TStream*, itsViewStream, NULL);
-
- FailInfo fi;
- Try(fi)
- {
- short numViews = 0;
-
- aHandle = NewPermHandle(kViewRsrcExpandAmt);// create a handle for the stream
-
- itsViewStream = this->DoMakeViewStream(kNoResource, aHandle);
-
- itsViewStream->WriteInteger(kMAThreeOhTemplateVersion);// Write version number
-
- itsViewStream->WriteStreamObject(view, kStandardObject);
-
- itsViewStream->Free();
-
- fi.Success();
- }
- else // Recover
- {
- itsViewStream = (TStream *)FreeIfObject(itsViewStream);
- aHandle = DisposeIfHandle(aHandle);
-
- fi.ReSignal();
- }
-
- return aHandle; // return the handle
- } // TViewServer::WriteViewsToHandle
-
- //----------------------------------------------------------------------------------------
- // End of UViewServer.cp
-
- #pragma segment Inline
-